package com.cqhilink.iot.jobstandardmanagement.common.calculator;
import com.cqhilink.api.common.utils.date.DateStyle;
import com.cqhilink.api.common.utils.date.DateUtil;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

/**
 * 时间计算器，传入开始时间 和 结束时间 ，
 * 计算下一次时间计算问题
 * @author 黄学乾 778142659@qq.com
 * @create 2017-08-08 14:18
 **/
public class TimeCalc {

    /**
     * @param startTime 开始时间  ； YYYY-MM-DD H24:MI:SS
     * @param ruleList 时间计算规则 ；
     * return 返回根据周期返回时间计算
     */
    public static Date calc(String startTime, List<Time> ruleList){
        // 将时间转换成时间格式
            Date startT = DateUtil.StringToDate(startTime, DateStyle.YYYY_MM_DD_HH_MM);
            List<Date> ruleListT = new ArrayList<>();
            if(ruleList != null){
                for(Time time: ruleList){
                    ruleListT.add(DateUtil.StringToDate(addDate(startT,time)));
                }
            }
            return nearDate(startT,ruleListT);
        }



        /**
         * @param startDate
         * @param time
         * @return
         */
         /*  gc.add(1,-1)表示年份减一.
            *gc.add(2,-1)表示月份减一.
            *gc.add(3.-1)表示周减一.
            *gc.add(5,-1)表示天减一.*/
        public static String addDate(Date startDate,Time time){
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(startDate);
            if(time.getName().equals("年")){
                calendar.add(Calendar.YEAR,time.getLv());
            }else if(time.getName().equals("月")){
                calendar.add(Calendar.MONTH,time.getLv());
            }else if(time.getName().equals("日")){
                calendar.add(Calendar.DATE, time.getLv());
            }
            SimpleDateFormat sf  =new SimpleDateFormat("yyyy-MM-dd HH:mm");
            return sf.format(calendar.getTime());
        }

    /**
     *
     * @param startD 基准时间
     * @param ruleD  时间集合
     * @return 最近时间
     */
    public static Date nearDate(Date startD , List<Date> ruleD){
        long min = 0l ;
        Date returnD = null ;
        if(ruleD != null && ruleD.size() > 0){
            for(Date date:ruleD){
              if(min == 0){
                  min = date.getTime() - startD.getTime() ;
                  returnD = date ;
              }else{
                 if( (date.getTime() - startD.getTime()) < min){
                     returnD = date ;
                 }
              }
            }
        }
        return returnD ;
    }

    public static void main(String[] args) {
        Time time = new Time() ;
        time.setLv(1);
        time.setName("年");
        List<Time> times = new ArrayList<>();
        times.add(time);
       // calc("2017-08-09",times);
        System.out.println("-------------"+calc("2017-08-09 10:29",times));
        System.out.println("-------------"+DateUtil.DateToString(calc("2017-08-09 10:29",times),DateStyle.YYYY_MM_DD_HH_MM));
    }

}
